/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.imsx.controller;

import com.imsx.controller.util.Cookies;
import com.imsx.controller.util.Driver;
import com.imsx.model.Cliente;
import com.imsx.model.Item;
import com.imsx.model.Orden;
import com.imsx.model.Producto;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import org.bson.types.ObjectId;
import java.io.IOException;
import java.io.Serializable;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;

/**
 *
 * @author mivkys
 */
@ManagedBean(name = "ordenController")
@SessionScoped
public class OrdenController implements Serializable {

    private Map<String, Producto> productos;// lista de productos disponibles
    private Map<String, Item> items;//lista de productos en el carrito
    private Map<String, Orden> ordenes; //lista de ordenes del cliente
    private Item selected;// iten actualmente seleccionado
    private Orden orden;// orden actual seleccionado
    private Cliente cliente; // cliente actual logeado

    //
    private DB dB;
    private Driver driver;
    private Producto producto;
    private String clienteID;
    private Cookies cookies;

    public OrdenController() {
    }

    @PostConstruct
    public void init() {
        try {
            dB = new Mongo().getDB("amazondb");
        } catch (UnknownHostException ex) {
            Logger.getLogger(OrdenController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MongoException ex) {
            Logger.getLogger(OrdenController.class.getName()).log(Level.SEVERE, null, ex);
        }
        cookies = new Cookies();
        productos = new HashMap<>();
        ordenes = new HashMap<>();
        cliente = new Cliente();
        producto = new Producto();
        clienteID = "548dd80de6c064038dd1a43a";

        Driver.findProducto(dB, null, productos);
        Driver.findCliente(dB, new BasicDBObject("_id", new ObjectId(clienteID)), cliente, ordenes, productos);/// Quitar cuando se ponga logeo
    }

    public void guardarCookies() {
        String cook = "";
        for (Item value : getItems()) {
            cook += value.toString();
        }
        cookies.setCookie(cliente.getClienteId(), cook, 5000);
    }

    public void extraerCookies() {
        String cook = cookies.getCookie(cliente.getClienteId());
        String[] filas = cook.split("[,]");
        String idOrden = "";
        int cant = 0;
        items = new HashMap<>();
        for (String fila : filas) {
            idOrden = fila.substring(0, fila.indexOf(":") - 1);
            cant = Integer.parseInt(fila.substring(fila.indexOf(":"), fila.length()));

            items.put(idOrden, new Item(productos.get(idOrden), cant));
        }
    }

    public void loggeo() {
        Driver.findCliente(dB, new BasicDBObject("_id", new ObjectId(clienteID)), cliente, ordenes, productos);
    }

    public void prepareCreateOrden(ActionEvent event) {//cuando agregamos una orden
        orden = new Orden(new ObjectId().toString());
        orden.setFechaCompra(new Date());
        selected = new Item(producto, 1);// borrar si se crea ventana
        items = new HashMap<String, Item>();
    }

    public void prepareCreateItem(ActionEvent event) {// cuando seleccionamos un producto

        selected = new Item(producto, 1);
    }

    public void createItemAjax(ActionEvent event) {//crear el item
        if (selected != null && selected.getCantidad() <= producto.getStock()) {
            selected.setItemId(producto.getProductoId());///podria
            items.put(selected.getItemId(), selected);
        }
    }

    public void createOrden(ActionEvent event) {
        createItemAjax(event);
        if (!items.isEmpty()) {
            try {
                orden.setItems(items);
                ArrayList<Object> ordens = new ArrayList<Object>();
                ordens.add(orden);
                Driver.insert(ordens, dB.getCollection("orden"));
            } catch (IOException ex) {
                Logger.getLogger(OrdenController.class.getName()).log(Level.SEVERE, null, ex);
            }
            items = new HashMap<String, Item>();
        }
    }

    /**
     * @return the orden
     */
    public Orden getOrden() {
        return orden;
    }

    /**
     * @param orden the orden to set
     */
    public void setOrden(Orden orden) {
        this.orden = orden;
    }

    public List<Item> getItems() {
        List<Item> targetList = new ArrayList<>(items.values());
        return targetList;
    }

    public void setItems(List<Item> items) {
        //this.items = items;
    }

    /**
     * @return the selected
     */
    public Item getSelected() {
        return selected;
    }

    /**
     * @param selected the selected to set
     */
    public void setSelected(Item selected) {
        this.selected = selected;
    }

    public List<Producto> getProductos() {
        List<Producto> targetList = new ArrayList<>(productos.values());
        return targetList;
    }

    public void setProductos(List<Producto> productos) {
        //this.productos = productos;
    }

    /**
     * @return the producto
     */
    public Producto getProducto() {
        return producto;
    }

    /**
     * @param producto the producto to set
     */
    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public List<Orden> getOrdenes() {
        List<Orden> targetList = new ArrayList<>(ordenes.values());
        return targetList;
    }

    public void setOrdenes(List<Orden> ordenes) {
        //this.ordenes = ordenes;
    }
}
